﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем КонтекстВыбора;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		ВызватьИсключение НСтр("ru = 'Управление итогами и агрегатами недоступно в модели сервиса.'");
	КонецЕсли;
	
	Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;
	
	ПрочитатьИнформациюПоРегистрам();
	
	ОбновитьСписокИтоговНаСервере();
	ОбновитьАгрегатыПоРегистрамНаСервере();
	
	Если АгрегатыПоРегистрам.Количество() <> 0 Тогда
		Элементы.СписокАгрегатов.Заголовок = Префикс() + " " + АгрегатыПоРегистрам[0].Наименование;
	Иначе
		Элементы.СписокАгрегатов.Заголовок = Префикс();
	КонецЕсли;
	
	Если СписокИтогов.Количество() = 0 Тогда
		Элементы.ГруппаИтогов.Доступность = Ложь;
		Элементы.УстановитьПериодРассчитанныхИтогов.Доступность = Ложь;
		Элементы.ВключитьИспользованиеИтогов.Доступность = Ложь;
	КонецЕсли;
	
	Если АгрегатыПоРегистрам.Количество() = 0 Тогда
		Элементы.ГруппаАгрегаты.Доступность = Ложь;
		Элементы.ПерестроитьИЗаполнитьАгрегаты.Доступность = Ложь;
		Элементы.ПолучитьОптимальныеАгрегаты.Доступность = Ложь;
	КонецЕсли;
	
	Элементы.Операции.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
	
	УстановитьРасширенныйРежим();
	
	РассчитатьИтогиНа = ТекущаяДатаСеанса();
	
	Элементы.ОписаниеУстановкиПериода.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		Элементы.ОписаниеУстановкиПериода.Заголовок,
		Формат(ОкончаниеПериода(ДобавитьМесяц(РассчитатьИтогиНа, -1)), "DLF=D"),
		Формат(ОкончаниеПериода(РассчитатьИтогиНа), "DLF=D"));
	
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	
	УстановитьРасширенныйРежим();
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.УправлениеИтогамиИАгрегатами.Форма.ФормаВыбораПериода") Тогда
		
		Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда
			Возврат;
		КонецЕсли;
		
		ПараметрыИтогов = Новый Структура;
		ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Установка периода рассчитанных итогов ...'"));
		ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Установка периода рассчитанных итогов завершена'"));
		ПараметрыИтогов.Вставить("Действие",               "УстановитьПериодИтогов");
		ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
		ПараметрыИтогов.Вставить("Поле",                   "ПериодИтогов");
		ПараметрыИтогов.Вставить("Значение1",              ВыбранноеЗначение.ПериодДляРегистровНакопления);
		ПараметрыИтогов.Вставить("Значение2",              ВыбранноеЗначение.ПериодДляРегистровБухгалтерии);
		ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось установить период рассчитанных итогов.'"));
		
		УправлениеИтогами(ПараметрыИтогов);
		
	ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.УправлениеИтогамиИАгрегатами.Форма.ФормаПараметровПерестроения") Тогда
		
		Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда
			Возврат;
		КонецЕсли;
		
		Если КонтекстВыбора = "ПерестроитьАгрегаты" Тогда
			
			ОтносительныйРазмер = ВыбранноеЗначение.ОтносительныйРазмер;
			МинимальныйЭффект   = ВыбранноеЗначение.МинимальныйЭффект;
			
			ПараметрыИтогов = Новый Структура;
			ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Перестроение агрегатов ...'"));
			ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Перестроение агрегатов завершено'"));
			ПараметрыИтогов.Вставить("Действие",               "ПерестроитьАгрегаты");
			ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки);
			ПараметрыИтогов.Вставить("Поле",                   "Наименование");
			ПараметрыИтогов.Вставить("Значение1",              ВыбранноеЗначение.ОтносительныйРазмер);
			ПараметрыИтогов.Вставить("Значение2",              ВыбранноеЗначение.МинимальныйЭффект);
			ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось перестроить агрегаты.'"));
			
			ИзменитьАгрегатыКлиент(ПараметрыИтогов);
			
		ИначеЕсли КонтекстВыбора = "АгрегатыОптимальные" Тогда
			
			ОптимальныйОтносительныйРазмер = ВыбранноеЗначение.ОтносительныйРазмер;
			ПолучитьОптимальныеАгрегатКлиент();
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ГиперссылкаСТекстомНажатие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ПолныеВозможности = Не ПолныеВозможности;
	УстановитьРасширенныйРежим();
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокИтогов

&НаКлиенте
Процедура СписокИтоговПриАктивизацииСтроки(Элемент)
	
	ПодключитьОбработчикОжидания("СписокИтоговПриАктивизацииСтрокиОтложенно", 0.1, Истина);	
		
КонецПроцедуры

&НаКлиенте
Процедура СписокИтоговПриАктивизацииСтрокиОтложенно()
	
	СписокИтоговПриАктивизацииСтрокиНаСервере();	
	
КонецПроцедуры

&НаСервере
Процедура СписокИтоговПриАктивизацииСтрокиНаСервере()
		
	ВыделенныеСтроки = Элементы.СписокИтогов.ВыделенныеСтроки;
	
	ВыделеныРегистрыСИтогами = Ложь;
	ВыделеныРегистрыСИтогамиИОстатками = Ложь;
	ВыделеныРегистрыСРазделениемИтогов = Ложь;
	
	Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
		СтрокаТаблицы =  СписокИтогов.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если СтрокаТаблицы = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Если СтрокаТаблицы.АгрегатыИтоги = 0 Или СтрокаТаблицы.АгрегатыИтоги = 2 Тогда
			ВыделеныРегистрыСИтогами = Истина;
			Если СтрокаТаблицы.ОстаткиИОбороты Тогда
				ВыделеныРегистрыСИтогамиИОстатками = Истина;
			КонецЕсли;
		КонецЕсли;
		Если СтрокаТаблицы.РазрешитьРазделениеИтогов Тогда
			ВыделеныРегистрыСРазделениемИтогов = Истина;
		КонецЕсли;
	КонецЦикла;
	
	Элементы.ГруппаИтоги.Доступность              = ВыделеныРегистрыСИтогами;
	Элементы.ГруппаТекущиеИтоги.Доступность       = ВыделеныРегистрыСИтогамиИОстатками;
	Элементы.ГруппаРазделениеИтогов.Доступность   = ВыделеныРегистрыСРазделениемИтогов;
	Элементы.УстановитьПериодИтогов.Доступность   = ВыделеныРегистрыСИтогамиИОстатками;	
	
КонецПроцедуры
	
&НаКлиенте
Процедура СписокИтоговВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ИмяМетаданного = СписокИтогов.НайтиПоИдентификатору(ВыбраннаяСтрока).ИмяМетаданного;
	Если Поле.Имя = "ИтогиАгрегатыИтоги" Тогда
		
		СтандартнаяОбработка = Ложь;
		
		МассивРезультата = АгрегатыПоРегистрам.НайтиСтроки(
			Новый Структура("ИмяМетаданного", ИмяМетаданного));
		
		Если МассивРезультата.Количество() > 0 Тогда
			
			Индекс = АгрегатыПоРегистрам.Индекс(МассивРезультата[0]);
			ТекущийЭлемент = Элементы.АгрегатыПоРегистрам;
			Элементы.АгрегатыПоРегистрам.ТекущаяСтрока = Индекс;
			Элементы.АгрегатыПоРегистрам.ТекущийЭлемент = Элементы.АгрегатыПоРегистрамНаименование;
			
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ВключитьИспользованиеИтогов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Включение использования итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Включение использования итогов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьИспользованиеИтогов");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "ИспользоватьИтоги");
	ПараметрыИтогов.Вставить("Значение1",              Истина);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось включить использование итогов.'"));
	
	УправлениеИтогами(ПараметрыИтогов);

КонецПроцедуры

&НаКлиенте
Процедура ВключитьИспользованиеТекущихИтогов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Включение использования текущих итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Включение использования текущих итогов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "ИспользоватьТекущиеИтоги");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "ИспользоватьТекущиеИтоги");
	ПараметрыИтогов.Вставить("Значение1",              Истина);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось включить использование текущих итогов.'"));
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьИспользованиеИтогов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Выключение использования итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Выключение использования итогов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьИспользованиеИтогов");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "ИспользоватьИтоги");
	ПараметрыИтогов.Вставить("Значение1",              Ложь);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось выключить использование итогов.'"));
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьИспользованиеТекущихИтогов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Выключение использования текущих итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Выключение использования текущих итогов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "ИспользоватьТекущиеИтоги");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "ИспользоватьТекущиеИтоги");
	ПараметрыИтогов.Вставить("Значение1",              Ложь);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось выключить использование текущих итогов.'"));
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСостояниеИтогов(Команда)
	
	ОбновитьСписокИтоговНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПериодИтогов(Команда)
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("РегНакопления",  Ложь);
	ПараметрыФормы.Вставить("РегБухгалтерии", Ложь);
	
	Для Каждого Индекс Из Элементы.СписокИтогов.ВыделенныеСтроки Цикл
		ИнформацияПоРегистру = СписокИтогов.НайтиПоИдентификатору(Индекс);
		ПараметрыФормы.РегНакопления  = ПараметрыФормы.РегНакопления  Или ИнформацияПоРегистру.Тип = 0;
		ПараметрыФормы.РегБухгалтерии = ПараметрыФормы.РегБухгалтерии Или ИнформацияПоРегистру.Тип = 1;
	КонецЦикла;
	
	ОткрытьФорму("Обработка.УправлениеИтогамиИАгрегатами.Форма.ФормаВыбораПериода", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьРазделениеИтогов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Включение разделения итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Включение разделения итогов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьРазделениеИтогов");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "РазделениеИтогов");
	ПараметрыИтогов.Вставить("Значение1",              Истина);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось включить разделение итогов.'"));
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьРазделениеИтогов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Выключение разделения итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Выключение разделения итогов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьРазделениеИтогов");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "РазделениеИтогов");
	ПараметрыИтогов.Вставить("Значение1",              Ложь);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось выключить разделение итогов.'"));
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИнформациюОбАгрегатах(Команда)
	
	ОбновитьАгрегатыПоРегистрамНаСервере();
	УстановитьФильтрСпискаАгрегатов();
	
КонецПроцедуры

&НаКлиенте
Процедура АгрегатыПоРегистрамПриАктивизацииСтроки(Элемент)
	
	УстановитьФильтрСпискаАгрегатов();
	
	Если Элемент.ТекущиеДанные = Неопределено Тогда
		ДоступностьЭлементов = Ложь;
		
	ИначеЕсли Элемент.РежимВыделения = РежимВыделенияТаблицы.Одиночный Тогда
		ДоступностьЭлементов = Элемент.ТекущиеДанные.РежимАгрегатов;
	Иначе
		ДоступностьЭлементов = Истина;
	КонецЕсли;
	
	Элементы.АгрегатыКнопкаПерестроить.Доступность                     = ДоступностьЭлементов;
	Элементы.АгрегатыКнопкаОчиститьАгрегатыПоРегистрам.Доступность     = ДоступностьЭлементов;
	Элементы.АгрегатыКнопкаЗаполнитьАгрегатыПоРегистрам.Доступность    = ДоступностьЭлементов;
	Элементы.АгрегатыКнопкаОптимальные.Доступность                     = ДоступностьЭлементов;
	Элементы.АгрегатыКнопкаОтключитьИспользованиеАгрегатов.Доступность = ДоступностьЭлементов;
	Элементы.АгрегатыКнопкаВключитьИспользованиеАгрегатов.Доступность  = ДоступностьЭлементов;
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьРежимАгрегатов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Включение режима агрегатов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Включение режима агрегатов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьРежимАгрегатов");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "РежимАгрегатов");
	ПараметрыИтогов.Вставить("Значение1",              Истина);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось включить режим агрегатов.'"));
	
	ИзменитьАгрегатыКлиент(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьРежимИтогов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Включение режима итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Включение режима итогов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьРежимАгрегатов");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "РежимАгрегатов");
	ПараметрыИтогов.Вставить("Значение1",              Ложь);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось включить режим итогов.'"));
	
	ИзменитьАгрегатыКлиент(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьИспользованиеАгрегатов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Включение использования агрегатов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Включение использования агрегатов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьИспользованиеАгрегатов");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "ИспользованиеАгрегатов");
	ПараметрыИтогов.Вставить("Значение1",              Истина);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось включить использование агрегатов.'"));
	
	ИзменитьАгрегатыКлиент(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыключитьИспользованиеАгрегатов(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Выключение использования агрегатов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Выключение использования агрегатов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьИспользованиеАгрегатов");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "ИспользованиеАгрегатов");
	ПараметрыИтогов.Вставить("Значение1",              Ложь);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось выключить использование агрегатов.'"));
	
	ИзменитьАгрегатыКлиент(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ПерестроитьАгрегаты(Команда)
	
	КонтекстВыбора = "ПерестроитьАгрегаты";
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ОтносительныйРазмер", ОтносительныйРазмер);
	ПараметрыФормы.Вставить("МинимальныйЭффект",   МинимальныйЭффект);
	ПараметрыФормы.Вставить("РежимПерестроения",   Истина);
	
	ОткрытьФорму("Обработка.УправлениеИтогамиИАгрегатами.Форма.ФормаПараметровПерестроения", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьАгрегатыПоРегистрам(Команда)
	
	ТекстВопроса = НСтр("ru = 'Очистка агрегатов может привести к существенному замедлению отчетов.'");
	
	Кнопки = Новый СписокЗначений;
	Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Очистить агрегаты'"));
	Кнопки.Добавить(КодВозвратаДиалога.Отмена);
	
	Обработчик = Новый ОписаниеОповещения("ОчиститьАгрегатыПоРегистрамЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Отмена);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьАгрегатыПоРегистрам(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Заполнение агрегатов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Заполнение агрегатов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "ЗаполнитьАгрегаты");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "Наименование");
	ПараметрыИтогов.Вставить("Значение1",              Неопределено);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось заполнить агрегаты.'"));
	
	ИзменитьАгрегатыКлиент(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура АгрегатыОптимальные(Команда)
	КонтекстВыбора = "АгрегатыОптимальные";
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ОтносительныйРазмер", ОптимальныйОтносительныйРазмер);
	ПараметрыФормы.Вставить("МинимальныйЭффект",   0);
	ПараметрыФормы.Вставить("РежимПерестроения",   Ложь);
	
	ОткрытьФорму("Обработка.УправлениеИтогамиИАгрегатами.Форма.ФормаПараметровПерестроения", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьПериодРассчитанныхИтогов(Команда)
	
	ОчиститьСообщения();
	
	МассивДействий = СписокИтогов.НайтиСтроки(Новый Структура("ОстаткиИОбороты", Истина));
	
	Если МассивДействий.Количество() = 0 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Отсутствуют регистры, для которых можно выполнить данную операцию.'"));
		Возврат;
	КонецЕсли;
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Установка периода рассчитанных итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Установка периода рассчитанных итогов завершена'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьПериодИтогов");
	ПараметрыИтогов.Вставить("МассивСтрок",            МассивДействий);
	ПараметрыИтогов.Вставить("Поле",                   "ПериодИтогов");
	ПараметрыИтогов.Вставить("Значение1",              ОкончаниеПериода(ДобавитьМесяц(РассчитатьИтогиНа, -1)) );
	ПараметрыИтогов.Вставить("Значение2",              ОкончаниеПериода(РассчитатьИтогиНа) );
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось установить период рассчитанных итогов.'"));
	ПараметрыИтогов.Вставить("ГрупповаяОбработка",     Истина);
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ВключитьИспользованиеИтоговБыстрыйДоступ(Команда)
	
	ОчиститьСообщения();
	
	МассивДействий = СписокИтогов.НайтиСтроки(Новый Структура("ИспользоватьИтоги", Ложь));
	
	Если МассивДействий.Количество() = 0 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Отсутствуют регистры, для которых можно выполнить данную операцию.'"));
		Возврат;
	КонецЕсли;
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Включение использования итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Включение использования итогов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "УстановитьИспользованиеИтогов");
	ПараметрыИтогов.Вставить("МассивСтрок",            МассивДействий);
	ПараметрыИтогов.Вставить("Поле",                   "");
	ПараметрыИтогов.Вставить("Значение1",              Истина);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось включить использование итогов.'"));
	ПараметрыИтогов.Вставить("ГрупповаяОбработка",     Истина);
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьАгрегатыИВыполнитьПерестроение(Команда)
	
	ОчиститьСообщения();
	
	МассивДействий = АгрегатыПоРегистрам.НайтиСтроки(Новый Структура("РежимАгрегатов,ИспользованиеАгрегатов", Истина, Истина));
	
	Если МассивДействий.Количество() = 0 Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Отсутствуют регистры, для которых можно выполнить выбранное действие.'"));
		Возврат;
	КонецЕсли;
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Перестроение агрегатов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Перестроение агрегатов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "ПерестроитьАгрегаты");
	ПараметрыИтогов.Вставить("МассивСтрок",            МассивДействий);
	ПараметрыИтогов.Вставить("Поле",                   "");
	ПараметрыИтогов.Вставить("Значение1",              0);
	ПараметрыИтогов.Вставить("Значение2",              0);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось перестроить агрегаты.'"));
	ПараметрыИтогов.Вставить("ГрупповаяОбработка",     Истина);
	
	ИзменитьАгрегатыКлиент(ПараметрыИтогов, Истина);
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Заполнение агрегатов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Заполнение агрегатов завершено'"));
	ПараметрыИтогов.Вставить("Действие",               "ЗаполнитьАгрегаты");
	ПараметрыИтогов.Вставить("МассивСтрок",            МассивДействий);
	ПараметрыИтогов.Вставить("Поле",                   "");
	ПараметрыИтогов.Вставить("Значение1",              Неопределено);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось заполнить агрегаты.'"));
	
	ИзменитьАгрегатыКлиент(ПараметрыИтогов, Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьОптимальныеАгрегаты(Команда)
	ПолучитьОптимальныеАгрегатКлиент();
КонецПроцедуры

&НаКлиенте
Процедура ПересчитатьИтоги(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Пересчет итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Пересчет итогов завершен.'"));
	ПараметрыИтогов.Вставить("Действие",               "ПересчитатьИтоги");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "Наименование");
	ПараметрыИтогов.Вставить("Значение1",              Ложь);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось пересчитать итоги.'"));
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ПересчитатьТекущиеИтоги(Команда)
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Пересчет текущих итогов ...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Пересчет текущих итогов завершен.'"));
	ПараметрыИтогов.Вставить("Действие",               "ПересчитатьТекущиеИтоги");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "Наименование");
	ПараметрыИтогов.Вставить("Значение1",              Ложь);
	ПараметрыИтогов.Вставить("Значение2",              Неопределено);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось пересчитать текущие итоги.'"));
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

&НаКлиенте
Процедура ПересчитатьИтогиЗаПериод(Команда)
	Обработчик = Новый ОписаниеОповещения("ПересчитатьИтогиЗаПериодЗавершение", ЭтотОбъект);
	Диалог = Новый ДиалогРедактированияСтандартногоПериода;
	Диалог.Период = ПериодПерерасчетаРегистров;
	Диалог.Показать(Обработчик);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИтогиАгрегатыИтоги.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокИтогов.АгрегатыИтоги");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 0;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Итоги'"));

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИтогиАгрегатыИтоги.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокИтогов.АгрегатыИтоги");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 1;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Агрегаты'"));

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИтогиАгрегатыИтоги.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокИтогов.АгрегатыИтоги");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 2;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = 'Просто итоговый регистр'"));

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИтогиИспользоватьТекущиеИтоги.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИтогиПериодИтогов.Имя);

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИтогиРазделениеИтогов.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокИтогов.ОстаткиИОбороты");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СеребристоСерый);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИтогиАгрегатыИтоги.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокИтогов.АгрегатыИтоги");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 2;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СеребристоСерый);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИтогиИспользоватьИтоги.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокИтогов.АгрегатыИтоги");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 1;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СеребристоСерый);

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обработчики асинхронных диалогов.

&НаКлиенте
Процедура ОчиститьАгрегатыПоРегистрамЗавершение(Ответ, ДополнительныеПараметры) Экспорт
	
	Если Ответ = КодВозвратаДиалога.Да Тогда
		
		ПараметрыИтогов = Новый Структура;
		ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Очистка агрегатов ...'"));
		ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Очистка агрегатов завершена'"));
		ПараметрыИтогов.Вставить("Действие",               "ОчиститьАгрегаты");
		ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки);
		ПараметрыИтогов.Вставить("Поле",                   "Наименование");
		ПараметрыИтогов.Вставить("Значение1",              Неопределено);
		ПараметрыИтогов.Вставить("Значение2",              Неопределено);
		ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось очистить агрегаты.'"));
		
		ИзменитьАгрегатыКлиент(ПараметрыИтогов);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПересчитатьИтогиЗаПериодЗавершение(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
	
	Если ВыбранноеЗначение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПериодПерерасчетаРегистров = ВыбранноеЗначение;
	
	ПараметрыИтогов = Новый Структура;
	ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок",  НСтр("ru = 'Пересчет итогов за период...'"));
	ПараметрыИтогов.Вставить("ПослеПроцесса",          НСтр("ru = 'Пересчет итогов за период завершен.'"));
	ПараметрыИтогов.Вставить("Действие",               "ПересчитатьИтогиЗаПериод");
	ПараметрыИтогов.Вставить("МассивСтрок",            Элементы.СписокИтогов.ВыделенныеСтроки);
	ПараметрыИтогов.Вставить("Поле",                   "Наименование");
	ПараметрыИтогов.Вставить("Значение1",              ПериодПерерасчетаРегистров.ДатаНачала);
	ПараметрыИтогов.Вставить("Значение2",              ПериодПерерасчетаРегистров.ДатаОкончания);
	ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru = 'Не удалось пересчитать итоги за период.'"));
	
	УправлениеИтогами(ПараметрыИтогов);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Клиент

&НаКлиенте
Процедура УстановитьФильтрСпискаАгрегатов()
	
	ТекущиеДанные = Элементы.АгрегатыПоРегистрам.ТекущиеДанные;
	
	Если ТекущиеДанные <> Неопределено Тогда
		Фильтр = Новый ФиксированнаяСтруктура("ИмяМетаданного", ТекущиеДанные.ИмяМетаданного);
		НовыйЗаголовок = Префикс() +  " " + ТекущиеДанные.Наименование;
	Иначе
		Фильтр = Новый ФиксированнаяСтруктура("ИмяМетаданного", "");
		НовыйЗаголовок = Префикс();
	КонецЕсли;
	
	Элементы.СписокАгрегатов.ОтборСтрок = Фильтр;
	
	Если Элементы.СписокАгрегатов.Заголовок <> НовыйЗаголовок Тогда
		Элементы.СписокАгрегатов.Заголовок = НовыйЗаголовок;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьАгрегатыКлиент(Знач ПараметрыИтогов, Знач ОчищатьСообщения = Истина)
	
	Результат = Истина;
	Если ОчищатьСообщения Тогда
		ОчиститьСообщения();
	КонецЕсли;
	Выбранные = ПараметрыИтогов.МассивСтрок;
	
	Если Выбранные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ШагПроцесса = 100/Выбранные.Количество();
	
	Если ПараметрыИтогов.Свойство("ГрупповаяОбработка") Тогда
		ТребуетсяПрерватьПослеОшибки = ?(ПараметрыИтогов.ГрупповаяОбработка, Ложь, ПрерыватьПриОшибке);
	Иначе
		ТребуетсяПрерватьПослеОшибки = ПрерыватьПриОшибке;
	КонецЕсли;
	
	Для Счетчик = 1 По Выбранные.Количество() Цикл
		Если ТипЗнч(Выбранные[Счетчик - 1]) = Тип("Число") Тогда
			ВыбраннаяСтрока = АгрегатыПоРегистрам.НайтиПоИдентификатору(Выбранные[Счетчик-1]);
		Иначе
			ВыбраннаяСтрока = Выбранные[Счетчик-1];
		КонецЕсли;
		
		ПолеСообщенияОбОшибке = "";
		Если Не ПустаяСтрока(ПараметрыИтогов.Поле) Тогда
			ПолеСообщенияОбОшибке = "АгрегатыПоРегистрам[" + Формат(Выбранные[Счетчик-1], "ЧГ=0") + "]." + ПараметрыИтогов.Поле;
		КонецЕсли;
		
		Если Не ВыбраннаяСтрока.РежимАгрегатов
			И ВРег(ПараметрыИтогов.Действие) <> ВРег("УстановитьРежимАгрегатов") Тогда
			ОбщегоНазначенияКлиент.СообщитьПользователю(
				НСтр("ru = 'Операция невозможна в режиме итогов'"),
				,
				ПолеСообщенияОбОшибке);
			Продолжить;
		КонецЕсли;
		
		Состояние(ПараметрыИтогов.ОбрабатыватьЗаголовок, Счетчик * ШагПроцесса, ВыбраннаяСтрока.Наименование);
		
		ПараметрыСервера = Новый Структура;
		ПараметрыСервера.Вставить("ИмяРегистра",        ВыбраннаяСтрока.ИмяМетаданного);
		ПараметрыСервера.Вставить("Действие",           ПараметрыИтогов.Действие);
		ПараметрыСервера.Вставить("ЗначениеДействия1",  ПараметрыИтогов.Значение1);
		ПараметрыСервера.Вставить("ЗначениеДействия2",  ПараметрыИтогов.Значение2);
		ПараметрыСервера.Вставить("СообщениеОбОшибке",  ПараметрыИтогов.ТекстСообщенияОбОшибке);
		ПараметрыСервера.Вставить("ПолеФормы",          ПолеСообщенияОбОшибке);
		ПараметрыСервера.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
		Результат = ИзменитьАгрегатыСервер(ПараметрыСервера);
		
		ОбработкаПрерыванияПользователя();
		
		Если Не Результат.Успешно И ТребуетсяПрерватьПослеОшибки Тогда
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	Если ВРег(ПараметрыИтогов.Действие) = ВРег("УстановитьРежимАгрегатов")
		Или ВРег(ПараметрыИтогов.Действие) = ВРег("УстановитьИспользованиеАгрегатов") Тогда
		ОбновитьСписокИтоговНаСервере();
	КонецЕсли;
	
	ОбновитьАгрегатыПоРегистрамНаСервере();
	
	Состояние(ПараметрыИтогов.ПослеПроцесса);
	УстановитьФильтрСпискаАгрегатов();
	
КонецПроцедуры

&НаКлиенте
Процедура УправлениеИтогами(Знач ПараметрыИтогов)
	
	Результат = Истина;
	ОчиститьСообщения();
	
	Выбранные = ПараметрыИтогов.МассивСтрок;
	Если Выбранные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ШагПроцесса = 100/Выбранные.Количество();
	Действие = НРег(ПараметрыИтогов.Действие);
	
	Если ПараметрыИтогов.Свойство("ГрупповаяОбработка") Тогда
		ТребуетсяПрерватьПослеОшибки = ?(ПараметрыИтогов.ГрупповаяОбработка, Ложь, ПрерыватьПриОшибке);
	Иначе
		ТребуетсяПрерватьПослеОшибки = ПрерыватьПриОшибке;
	КонецЕсли;
	
	КоличествоОбработанныхСтрок = 0;
	ЕстьРегистрыДляОбработки    = Ложь;
	
	Для Счетчик = 1 По Выбранные.Количество() Цикл
		Если ТипЗнч(Выбранные[Счетчик-1]) = Тип("Число") Тогда
			ВыбраннаяСтрока = СписокИтогов.НайтиПоИдентификатору(Выбранные[Счетчик-1]);
		Иначе
			ВыбраннаяСтрока = Выбранные[Счетчик-1];
		КонецЕсли;
		
		Состояние(ПараметрыИтогов.ОбрабатыватьЗаголовок, Счетчик * ШагПроцесса, ВыбраннаяСтрока.Наименование);
		
		Если ВРег(Действие) = ВРег("УстановитьИспользованиеИтогов") Тогда
			Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Тогда
				Продолжить;
			КонецЕсли;
			
		ИначеЕсли ВРег(Действие) = ВРег("ИспользоватьТекущиеИтоги") Тогда
			Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Или Не ВыбраннаяСтрока.ОстаткиИОбороты Тогда
				Продолжить;
			КонецЕсли;
			
		ИначеЕсли ВРег(Действие) = ВРег("УстановитьПериодИтогов") Тогда
			Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Или Не ВыбраннаяСтрока.ОстаткиИОбороты Тогда
				Продолжить;
			КонецЕсли;
			
		ИначеЕсли ВРег(Действие) = ВРег("УстановитьРазделениеИтогов") Тогда
			Если Не ВыбраннаяСтрока.РазрешитьРазделениеИтогов Тогда
				Продолжить;
			КонецЕсли;
			
		ИначеЕсли ВРег(Действие) = ВРег("ПересчитатьИтоги") Тогда
			Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Тогда
				Продолжить;
			КонецЕсли;
			
		ИначеЕсли ВРег(Действие) = ВРег("ПересчитатьИтогиЗаПериод") Тогда
			Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Или Не ВыбраннаяСтрока.ОстаткиИОбороты Тогда
				Продолжить;
			КонецЕсли;
			
		ИначеЕсли ВРег(Действие) = ВРег("ПересчитатьТекущиеИтоги") Тогда
			Если Не ВыбраннаяСтрока.ОстаткиИОбороты Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;
		
		ПолеСообщенияОбОшибке = "";
		Если Не ПустаяСтрока(ПараметрыИтогов.Поле) Тогда
			ПолеСообщенияОбОшибке = "СписокИтогов[" + Формат(Выбранные[Счетчик-1], "ЧГ=0") + "]." + ПараметрыИтогов.Поле;
		КонецЕсли;
		
		ЕстьРегистрыДляОбработки = Истина;
		
		Результат = УстановитьПараметрыРегистраНаСервере(
			ВыбраннаяСтрока.Тип,
			ВыбраннаяСтрока.ИмяМетаданного,
			ПараметрыИтогов.Действие,
			ПараметрыИтогов.Значение1,
			ПараметрыИтогов.Значение2,
			ПолеСообщенияОбОшибке,
			ПараметрыИтогов.ТекстСообщенияОбОшибке);
		
		ОбработкаПрерыванияПользователя();
		
		Если Не Результат И ТребуетсяПрерватьПослеОшибки Тогда
			Прервать;
		КонецЕсли;
		
		Если Результат Тогда
			КоличествоОбработанныхСтрок = КоличествоОбработанныхСтрок + 1;
		КонецЕсли;
	КонецЦикла;
	
	Если Не ЕстьРегистрыДляОбработки Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'Отсутствуют регистры, для которых можно выполнить данную операцию.'"));
		Возврат;
	КонецЕсли;
	
	ОбновитьСписокИтоговНаСервере();
	
	ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Пересчитаны (%1 из %2)'"),
		КоличествоОбработанныхСтрок,
		Выбранные.Количество());
	
	Состояние(ПараметрыИтогов.ПослеПроцесса + Символы.ПС + ТекстСостояния);
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьОптимальныеАгрегатКлиент()
	
	Если ПолныеВозможности Тогда
		Если Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки.Количество() = 0 Тогда
			Возврат;
		КонецЕсли;
	Иначе
		Если АгрегатыПоРегистрам.Количество() = 0 Тогда
			ПоказатьПредупреждение(, НСтр("ru = 'Отсутствуют регистры, для которых можно выполнить данную операцию.'"));
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	Результат = ПолучитьОптимальныеАгрегатыСервер();
	Обработчик = Новый ОписаниеОповещения("ПолучитьОптимальныеАгрегатКлиентЗавершение", ЭтотОбъект, Результат);
	Если Не Результат.МожноПолучить Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Сохранить оптимальные агрегаты в файл'");
	Расширение = НРег(Сред(Результат.ИмяФайла, СтрНайти(Результат.ИмяФайла, ".") + 1));
	Если Расширение = "zip" Тогда
		Фильтр = НСтр("ru = 'Файлы настроек агрегатов (*.zip)|*.zip'");
	ИначеЕсли Расширение = "xml" Тогда
		Фильтр = НСтр("ru = 'Файлы настроек агрегатов (*.xml)|*.xml'");
	Иначе
		Фильтр = "";
	КонецЕсли;
	ПараметрыСохранения.Диалог.Фильтр = Фильтр;
	ПараметрыСохранения.Диалог.ПолноеИмяФайла = Результат.ИмяФайла;
	ФайловаяСистемаКлиент.СохранитьФайл(Обработчик, Результат.АдресФайла, Результат.ИмяФайла, ПараметрыСохранения);
	
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьОптимальныеАгрегатКлиентЗавершение(ПолученныеФайлы, РезультатВыполнения) Экспорт
	
	Если ПолученныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если РезультатВыполнения.ЕстьОшибки Тогда
		ВызватьИсключение РезультатВыполнения.ТекстСообщения;
	КонецЕсли;
	ПоказатьОповещениеПользователя(НСтр("ru = 'Агрегаты успешно получены.'"),,
		 РезультатВыполнения.ТекстСообщения, БиблиотекаКартинок.Успешно32);

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Клиент, Сервер

&НаКлиентеНаСервереБезКонтекста
Функция ОкончаниеПериода(Знач Дата)
	
	Возврат КонецДня(КонецМесяца(Дата));
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция Префикс()
	
	Возврат НСтр("ru = 'Агрегаты регистра'");
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Вызов сервера, Сервер

&НаСервере
Функция ПолучитьОптимальныеАгрегатыСервер()
	
	Результат = Новый Структура;
	Результат.Вставить("МожноПолучить", Ложь);
	Результат.Вставить("АдресФайла", "");
	Результат.Вставить("ИмяФайла", "");
	Результат.Вставить("ЕстьОшибки", Ложь);
	Результат.Вставить("ТекстСообщения", "");
	
	Если ПолныеВозможности Тогда
		Коллекция = ВыделенныеСтроки("АгрегатыПоРегистрам");
		МаксимальныйОтносительныйРазмер = ОптимальныйОтносительныйРазмер;
	Иначе
		Коллекция = АгрегатыПоРегистрам;
		МаксимальныйОтносительныйРазмер = 0;
	КонецЕсли;
	Всего = Коллекция.Количество();
	Успешно = 0;
	ПодробныйТекстОшибок = "";
	
	КаталогВременныхФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(
		ПолучитьИмяВременногоФайла(".TAM")); // Totals & Aggregates Management.
	СоздатьКаталог(КаталогВременныхФайлов);
	
	ФайлыДляАрхивации = Новый СписокЗначений;
	
	// Получение агрегатов.
	Для НомерСтроки = 1 По Всего Цикл
		
		ИмяРегистраНакопления = Коллекция[НомерСтроки - 1].ИмяМетаданного;
		
		МенеджерРегистра = РегистрыНакопления[ИмяРегистраНакопления];
		Попытка
			ОптимальныеАгрегаты = МенеджерРегистра.ОпределитьОптимальныеАгрегаты(МаксимальныйОтносительныйРазмер);
		Исключение
			Результат.ЕстьОшибки = Истина;
			ПодробныйТекстОшибок = ПодробныйТекстОшибок
				+ ?(ПустаяСтрока(ПодробныйТекстОшибок), "", Символы.ПС + Символы.ПС)
				+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1: %2'"), ИмяРегистраНакопления, 
					ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			Продолжить;
		КонецПопытки;
		
		ПолноеИмяФайла = КаталогВременныхФайлов + ИмяРегистраНакопления + ".xml";
		
		ЗаписьXML = Новый ЗаписьXML();
		ЗаписьXML.ОткрытьФайл(ПолноеИмяФайла);
		ЗаписьXML.ЗаписатьОбъявлениеXML();
		СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОптимальныеАгрегаты);
		ЗаписьXML.Закрыть();
		
		ФайлыДляАрхивации.Добавить(ПолноеИмяФайла, ИмяРегистраНакопления);
		Успешно = Успешно + 1;
		
	КонецЦикла;
	
	// Подготовка результата к передаче на клиент.
	Если Успешно > 0 Тогда
		
		Если Успешно = 1 Тогда
			ЭлементСписка = ФайлыДляАрхивации[0];
			ПолноеИмяФайла = ЭлементСписка.Значение;
			КраткоеИмяФайла = ЭлементСписка.Представление + ".xml";
		Иначе
			КраткоеИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Оптимальные агрегаты регистров накопления %1.zip'"),
				Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd"));
			ПолноеИмяФайла = КаталогВременныхФайлов + КраткоеИмяФайла;
			РежимСохранения = РежимСохраненияПутейZIP.СохранятьОтносительныеПути;
			РежимОбработки = РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно;
			ЗаписьZipФайла = Новый ЗаписьZipФайла(ПолноеИмяФайла);
			Для Каждого ЭлементСписка Из ФайлыДляАрхивации Цикл
				ЗаписьZipФайла.Добавить(ЭлементСписка.Значение, РежимСохранения, РежимОбработки);
			КонецЦикла;
			ЗаписьZipФайла.Записать();
		КонецЕсли;
		ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла);
		Результат.МожноПолучить = Истина;
		Результат.ИмяФайла      = КраткоеИмяФайла;
		Результат.АдресФайла    = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
		
	КонецЕсли;
	
	// Очистка мусора.
	УдалитьФайлы(КаталогВременныхФайлов);
	
	// Подготовка текстов сообщений.
	Если Всего = 1 Тогда
		
		// Когда 1 регистр.
		ЭлементСписка = Коллекция[0];
		ИмяРегистра = ЭлементСписка.Наименование;
		Если Результат.ЕстьОшибки Тогда
			Результат.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось получить оптимальные агрегаты регистра накопления ""%1"" по причине:
					|%2'"), ИмяРегистра, ПодробныйТекстОшибок);
		Иначе
			Результат.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = '%1 (регистр накопления)'"),	ИмяРегистра);
		КонецЕсли;
		
	ИначеЕсли Успешно = 0 Тогда
		
		// Ничего не получилось.
		Результат.ЕстьОшибки = Истина;
		Результат.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось получить оптимальные агрегаты регистров накопления по причине:
			|%1'"), ПодробныйТекстОшибок);
		
	ИначеЕсли Результат.ЕстьОшибки Тогда
		
		// Частично успешно.
		Результат.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Агрегаты успешно получены для %1 из %2 регистров.
				|Не получены для %3 по причине:
				|%4'"),
				Успешно,
				Всего,
				Всего - Успешно,
				ПодробныйТекстОшибок);
		
	Иначе
		
		// Полностью успешно.
		Результат.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Регистры накопления (%1)'"), Успешно);
			
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

&НаСервере
Процедура ОбновитьСписокИтоговНаСервере()
	
	Менеджеры = Новый Массив;
	Менеджеры.Добавить(РегистрыНакопления);
	Менеджеры.Добавить(РегистрыБухгалтерии);
	
	Для Каждого СтрокаТаблицы Из СписокИтогов Цикл
		
		Регистр = Менеджеры[СтрокаТаблицы.Тип][СтрокаТаблицы.ИмяМетаданного];
		
		СтрокаТаблицы.ИспользоватьИтоги = Регистр.ПолучитьИспользованиеИтогов();
		СтрокаТаблицы.РазделениеИтогов  = Регистр.ПолучитьРежимРазделенияИтогов();
		
		Если СтрокаТаблицы.ОстаткиИОбороты Тогда
			
			СтрокаТаблицы.ИспользоватьТекущиеИтоги = Регистр.ПолучитьИспользованиеТекущихИтогов();
			СтрокаТаблицы.ПериодИтогов             = Регистр.ПолучитьМаксимальныйПериодРассчитанныхИтогов();
			СтрокаТаблицы.АгрегатыИтоги            = 2;
			
		Иначе
			
			СтрокаТаблицы.ИспользоватьТекущиеИтоги = Ложь;
			СтрокаТаблицы.ПериодИтогов             = Неопределено;
			СтрокаТаблицы.АгрегатыИтоги            = Регистр.ПолучитьРежимАгрегатов();
			
			Если СтрокаТаблицы.АгрегатыИтоги Тогда
				СтрокаТаблицы.ИспользоватьИтоги = Ложь;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ГруппаИтоговЗаголовок = НСтр("ru = 'Итоги'");
	КоличествоИтогов = СписокИтогов.Количество();
	Если КоличествоИтогов > 0 Тогда
		ГруппаИтоговЗаголовок = ГруппаИтоговЗаголовок + " (" + Формат(КоличествоИтогов, "ЧГ=") + ")";
	КонецЕсли;
	
	Элементы.ГруппаИтогов.Заголовок = ГруппаИтоговЗаголовок;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьАгрегатыПоРегистрамНаСервере()
	
	СписокАгрегатовРегистра.Очистить();
	
	Для Каждого СтрокаТаблицы Из АгрегатыПоРегистрам Цикл
		
		МенеджерРегистра = РегистрыНакопления[СтрокаТаблицы.ИмяМетаданного];
		
		СтрокаТаблицы.РежимАгрегатов         = МенеджерРегистра.ПолучитьРежимАгрегатов();
		СтрокаТаблицы.ИспользованиеАгрегатов = МенеджерРегистра.ПолучитьИспользованиеАгрегатов();

		Агрегаты = МенеджерРегистра.ПолучитьАгрегаты();
		СтрокаТаблицы.ДатаПостроения     = Агрегаты.ДатаПостроения;
		СтрокаТаблицы.Размер             = Агрегаты.Размер;
		СтрокаТаблицы.ОграничениеРазмера = Агрегаты.ОграничениеРазмера;
		СтрокаТаблицы.Эффект             = Агрегаты.Эффект;
		
		Для Каждого Агрегат Из Агрегаты.Агрегаты Цикл // ИнформацияОбАгрегате
			
			СинонимыИзмерений = Новый Массив;
			Для Каждого ИмяИзмерения Из Агрегат.Измерения Цикл
				СинонимИзмерения = Метаданные.РегистрыНакопления[СтрокаТаблицы.ИмяМетаданного].Измерения[ИмяИзмерения].Синоним;
				СинонимыИзмерений.Добавить(СинонимИзмерения);
			КонецЦикла;
			
			СтрокаАгрегатовРегистра = СписокАгрегатовРегистра.Добавить();
			СтрокаАгрегатовРегистра.ИмяМетаданного = СтрокаТаблицы.ИмяМетаданного;
			СтрокаАгрегатовРегистра.Периодичность  = Строка(Агрегат.Периодичность);
			СтрокаАгрегатовРегистра.Измерения      = СтрСоединить(СинонимыИзмерений, ", ");
			СтрокаАгрегатовРегистра.Использование  = Агрегат.Использование;
			СтрокаАгрегатовРегистра.НачалоПериода  = Агрегат.НачалоПериода;
			СтрокаАгрегатовРегистра.КонецПериода   = Агрегат.КонецПериода;
			СтрокаАгрегатовРегистра.Размер         = Агрегат.Размер;
			
		КонецЦикла;
	КонецЦикла;
	
	СписокАгрегатовРегистра.Сортировать("Использование Убыв");
	
	ГруппаАгрегатыЗаголовок = НСтр("ru = 'Агрегаты'");
	КоличествоАгрегатов = АгрегатыПоРегистрам.Количество();
	Если КоличествоАгрегатов > 0 Тогда
		ГруппаАгрегатыЗаголовок = ГруппаАгрегатыЗаголовок + " (" + Формат(КоличествоАгрегатов, "ЧГ=") + ")";
	КонецЕсли;
	
	Элементы.ГруппаАгрегаты.Заголовок = ГруппаАгрегатыЗаголовок;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция УстановитьПараметрыРегистраНаСервере(Знач ВидРегистра,
                                             Знач ИмяРегистра,
                                             Знач Действие,
                                             Знач Значение1,
                                             Знач Значение2, // Значение по умолчанию: Неопределено.
                                             Знач ПолеОшибки,
                                             Знач СообщениеОбОшибке)
	
	Менеджеры = Новый Массив;
	Менеджеры.Добавить(РегистрыНакопления);
	Менеджеры.Добавить(РегистрыБухгалтерии);
	
	Менеджер = Менеджеры[ВидРегистра][ИмяРегистра];
	Действие = НРег(Действие);
	
	Попытка
		
		Если ВРег(Действие) = ВРег("УстановитьИспользованиеИтогов") Тогда
			Менеджер.УстановитьИспользованиеИтогов(Значение1);
			
		ИначеЕсли ВРег(Действие) = ВРег("ИспользоватьТекущиеИтоги") Тогда
			Менеджер.УстановитьИспользованиеТекущихИтогов(Значение1);
			
		ИначеЕсли ВРег(Действие) = ВРег("УстановитьРазделениеИтогов") Тогда
			Менеджер.УстановитьРежимРазделенияИтогов(Значение1);
			
		ИначеЕсли ВРег(Действие) = ВРег("УстановитьПериодИтогов") Тогда
			
			Если ВидРегистра = 0 Тогда
				Дата = Значение1;
				
			ИначеЕсли ВидРегистра = 1 Тогда
				Дата = Значение2;
			КонецЕсли;
			
			Менеджер.УстановитьМаксимальныйПериодРассчитанныхИтогов(Дата);
			
		ИначеЕсли ВРег(Действие) = ВРег("ПересчитатьИтоги") Тогда
			Менеджер.ПересчитатьИтоги();
			
		ИначеЕсли ВРег(Действие) = ВРег("ПересчитатьТекущиеИтоги") Тогда
			Менеджер.ПересчитатьТекущиеИтоги();
			
		ИначеЕсли ВРег(Действие) = ВРег("ПересчитатьИтогиЗаПериод") Тогда
			Менеджер.ПересчитатьИтогиЗаПериод(Значение1, Значение2);
			
		Иначе
			ВызватьИсключение НСтр("ru = 'Неправильное имя параметра'") + "(1): " + Действие;
		КонецЕсли;
		
	Исключение
		
		ОбщегоНазначения.СообщитьПользователю(
			СообщениеОбОшибке
			+ Символы.ПС
			+ ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),
			,
			ПолеОшибки);
		Возврат Ложь;
		
	КонецПопытки;
	
	Возврат Истина;
	
КонецФункции

&НаСервереБезКонтекста
Функция ИзменитьАгрегатыСервер(Знач ПараметрыСервера)
	
	Результат = Новый Структура;
	Результат.Вставить("Успешно", Истина);
	Результат.Вставить("ЗначениеДействия1", ПараметрыСервера.ЗначениеДействия1);
	Результат.Вставить("АдресФайлаВоВременномХранилище", "");
	
	МенеджерРегистра = РегистрыНакопления[ПараметрыСервера.ИмяРегистра];
	
	Попытка
		
		Если ВРег(ПараметрыСервера.Действие) = ВРег("УстановитьРежимАгрегатов") Тогда
			МенеджерРегистра.УстановитьРежимАгрегатов(ПараметрыСервера.ЗначениеДействия1);
			
		ИначеЕсли ВРег(ПараметрыСервера.Действие) = ВРег("УстановитьИспользованиеАгрегатов") Тогда
			МенеджерРегистра.УстановитьИспользованиеАгрегатов(ПараметрыСервера.ЗначениеДействия1);
			
		ИначеЕсли ВРег(ПараметрыСервера.Действие) = ВРег("ЗаполнитьАгрегаты") Тогда
			МенеджерРегистра.ОбновитьАгрегаты(Ложь);
			
		ИначеЕсли ВРег(ПараметрыСервера.Действие) = ВРег("ПерестроитьАгрегаты") Тогда
			МенеджерРегистра.ПерестроитьИспользованиеАгрегатов(ПараметрыСервера.ЗначениеДействия1, ПараметрыСервера.ЗначениеДействия2);
			
		ИначеЕсли ВРег(ПараметрыСервера.Действие) = ВРег("ОчиститьАгрегаты") Тогда
			МенеджерРегистра.ОчиститьАгрегаты();
			
		Иначе
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Неправильное имя параметра: %1'"),
				ПараметрыСервера.Действие);
		КонецЕсли;
		
	Исключение
		
		СообщениеОбОшибке = ПараметрыСервера.СообщениеОбОшибке + " (" + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + ")";
		ОбщегоНазначения.СообщитьПользователю(СообщениеОбОшибке);
		Результат.Успешно = Ложь;
		
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура УстановитьРасширенныйРежим()
	
	Если ПолныеВозможности Тогда
		Заголовок        = НСтр("ru = 'Управление итогами - полные возможности'");
		ТекстГиперссылки = НСтр("ru = 'Часто используемые возможности'");
		Элементы.Операции.ТекущаяСтраница = Элементы.РасширенныеВозможности;
	Иначе
		Заголовок        = НСтр("ru = 'Управление итогами - часто используемые возможности'");
		ТекстГиперссылки = НСтр("ru = 'Полные возможности'");
		Элементы.Операции.ТекущаяСтраница = Элементы.БыстрыйДоступ;
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Сервер

&НаСервере
Функция ВыделенныеСтроки(ИмяТаблицы)
	
	Результат = Новый Массив;
	ВыделенныеСтроки = Элементы[ИмяТаблицы].ВыделенныеСтроки;
	Таблица = ЭтотОбъект[ИмяТаблицы];
	Для Каждого Идентификатор Из ВыделенныеСтроки Цикл
		Результат.Добавить(Таблица.НайтиПоИдентификатору(Идентификатор));
	КонецЦикла;
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ПрочитатьИнформациюПоРегистрам()
	
	СписокИтогов.Очистить();
	АгрегатыПоРегистрам.Очистить();
	СписокАгрегатовРегистра.Очистить();
	
	Картинка = БиблиотекаКартинок.РегистрБухгалтерии;
	Для Каждого Регистр Из Метаданные.РегистрыБухгалтерии Цикл
		
		Если Не ПравоДоступа("УправлениеИтогами", Регистр) Тогда
			Продолжить;
		КонецЕсли;
		
		Представление = Регистр.Представление() + " (" + НСтр("ru = 'регистр бухгалтерии'") + ")";
		
		СтрокаТаблицы = СписокИтогов.Добавить();
		СтрокаТаблицы.Тип                       = 1;
		СтрокаТаблицы.ИмяМетаданного            = Регистр.Имя;
		СтрокаТаблицы.Картинка                  = Картинка;
		СтрокаТаблицы.ОстаткиИОбороты           = Истина;
		СтрокаТаблицы.Наименование              = Представление;
		СтрокаТаблицы.РазрешитьРазделениеИтогов = Регистр.РазрешитьРазделениеИтогов;
		
	КонецЦикла;
	
	Картинка = БиблиотекаКартинок.РегистрНакопления;
	Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл
		
		Постфикс = "";
		Если Регистр.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда
			ОстаткиИОбороты = Ложь;
			Постфикс = НСтр("ru = 'регистр накопления, только обороты'");
		Иначе
			ОстаткиИОбороты = Истина;
			Постфикс = НСтр("ru = 'регистр накопления, остатки и обороты'");
		КонецЕсли;
		
		Если Не ПравоДоступа("УправлениеИтогами", Регистр) Тогда
			Продолжить;
		КонецЕсли;
		
		Представление = Регистр.Представление() + " (" + Постфикс + ")";
		
		СтрокаТаблицы = СписокИтогов.Добавить();
		СтрокаТаблицы.Тип                       = 0;
		СтрокаТаблицы.ИмяМетаданного            = Регистр.Имя;
		СтрокаТаблицы.Картинка                  = Картинка;
		СтрокаТаблицы.ОстаткиИОбороты           = ОстаткиИОбороты;
		СтрокаТаблицы.Наименование              = Представление;
		СтрокаТаблицы.РазрешитьРазделениеИтогов = Регистр.РазрешитьРазделениеИтогов ;
		
	КонецЦикла;
	
	Картинка = БиблиотекаКартинок.РегистрНакопления;
	Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл
		
		Если Регистр.ВидРегистра <> Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Обороты Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ПравоДоступа("УправлениеИтогами", Регистр) Тогда
			Продолжить;
		КонецЕсли;
		
		Представление = Регистр.Представление();
		Агрегаты = Регистр.Агрегаты;
		Если Агрегаты.Количество() = 0 Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаТаблицы = АгрегатыПоРегистрам.Добавить();
		СтрокаТаблицы.ИмяМетаданного       = Регистр.Имя;
		СтрокаТаблицы.Картинка             = Картинка;
		СтрокаТаблицы.Наименование         = Представление;
		СтрокаТаблицы.ПостроениеОптимально = Истина;
		
	КонецЦикла;
	
	СписокИтогов.Сортировать("Наименование Возр");
	АгрегатыПоРегистрам.Сортировать("Наименование Возр");
	
КонецПроцедуры

#КонецОбласти
